package com.ucarbon.ucarbon.utils;

import java.sql.Types;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
// 这里就算没有直接用到这个类，但是必须要引入，否则会报错，找不到mysql
import com.mysql.cj.jdbc.Driver;
// 这里就算没有直接用到这个类，但是必须要引入，否则会报错，找不到freemaker
import freemarker.template.Configuration;
import freemarker.template.Template;

/**
 * 该类为实现自动按照数据库自动生成相关代码来实现，主要参考mybatis-plus网站中的相关内容。
 * 
 * @author XuGaoran
 * @since 1.0.0
 * @version 1.0.0
 */
@SuppressWarnings("all")
public class GenerateCode {

    /* 用户名称 */
    private static final String AUTHOR = "XuGaoran";

    /* 当前工作目录 */
    private static final String USER_DIR = System.getProperty("user.dir");

    /* JDBC 链接网址 */
    private static final String JDBC_URL = "jdbc:mysql://192.168.107.198:3306/ucarbon?userUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";

    /* 用户密码 */
    private static final String JDBC_PASSWORD = "xgr_010703";

    /* 用户名 */
    private static final String JDBC_USERNAME = "xgr";

    /* 包配置 -父级目录 */
    private static final String PACKAGE_PARENT = "com.ucarbon";

    /* 包配置--模块目录， */
    private static final String PACKAGE_MODULE_NAME = "ucarbon";

    /* 要生成的表，用','分隔 */
    private static final String TABLES = "u_country_landstype,u_landstype";

    /* 需要取出的前缀 */
    private static final String TABLES_PREFIX = "u_";

    /**
     * 直接使用官网提供的代码实例既可以完成代码的生成
     * 
     * @param args
     */
    public static void main(String[] args) {
        FastAutoGenerator.create(JDBC_URL, JDBC_USERNAME, JDBC_PASSWORD)
                .globalConfig(builder -> {
                    builder.author(AUTHOR) // 设置作者
                            .outputDir(USER_DIR + "/src/main/java"); // 指定输出目录
                })
                .dataSourceConfig(builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                    int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                    if (typeCode == Types.SMALLINT) {
                        // 自定义类型转换
                        return DbColumnType.INTEGER;
                    }
                    return typeRegistry.getColumnType(metaInfo);

                }))
                .packageConfig(builder -> {
                    builder.parent(PACKAGE_PARENT) // 设置父包名
                            .moduleName(PACKAGE_MODULE_NAME); // 设置父包模块名
                })
                .strategyConfig(builder -> {
                    builder.addInclude(TABLES.split(",")) // 设置需要生成的表名
                            .addTablePrefix(TABLES_PREFIX); // 设置过滤表前缀
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .execute();
    }
}
